function! s:next(steps, current_index, result) abort
  if len(a:steps) == a:current_index
    return
  endif
  let l:Step = a:steps[a:current_index]
  let l:ctx = {
        \ 'callback': function('s:callback', [a:steps, a:current_index]),
        \ 'result': a:result
        \ }
  call call(l:Step, [l:ctx])
endfunction

function! s:callback(steps, current_index, ...) abort
  call s:next(a:steps, a:current_index + 1, a:000)
endfunction

function! easycomplete#lsp#utils#step#start(steps) abort
  call s:next(a:steps, 0, [])
endfunction
